package models

import (
	"fmt"
	"time"
)

// SysMenu  菜单权限表
type SysMenu struct {
	Component  string    `json:"component" xorm:"comment('组件路径') VARCHAR(255)"`
	CreateBy   string    `json:"create_by" xorm:"default '' comment('创建者') VARCHAR(64)"`
	CreateTime time.Time `json:"create_time" xorm:"comment('创建时间') DATETIME"`
	Icon       string    `json:"icon" xorm:"default '#' comment('菜单图标') VARCHAR(100)"`
	IsCache    int       `json:"is_cache" xorm:"default 0 comment('是否缓存（0缓存 1不缓存）') INT"`
	IsFrame    int       `json:"is_frame" xorm:"default 1 comment('是否为外链（0是 1否）') INT"`
	MenuId     int64     `json:"menu_id" xorm:"not null pk autoincr comment('菜单ID') BIGINT"`
	MenuName   string    `json:"menu_name" xorm:"not null comment('菜单名称') VARCHAR(50)"`
	MenuType   string    `json:"menu_type" xorm:"default '' comment('菜单类型（M目录 C菜单 F按钮）') CHAR(1)"`
	OrderNum   int       `json:"order_num" xorm:"default 0 comment('显示顺序') INT"`
	ParentId   int64     `json:"parent_id" xorm:"default 0 comment('父菜单ID') BIGINT"`
	Path       string    `json:"path" xorm:"default '' comment('路由地址') VARCHAR(200)"`
	Perms      string    `json:"perms" xorm:"comment('权限标识') VARCHAR(100)"`
	Query      string    `json:"query" xorm:"comment('路由参数') VARCHAR(255)"`
	Remark     string    `json:"remark" xorm:"default '' comment('备注') VARCHAR(500)"`
	Status     string    `json:"status" xorm:"default '0' comment('菜单状态（0正常 1停用）') CHAR(1)"`
	UpdateBy   string    `json:"update_by" xorm:"default '' comment('更新者') VARCHAR(64)"`
	UpdateTime time.Time `json:"update_time" xorm:"comment('更新时间') DATETIME"`
	Visible    string    `json:"visible" xorm:"default '0' comment('菜单状态（0显示 1隐藏）') CHAR(1)"`
}

func (sysMenu *SysMenu) GetRoute() ([]SysMenu, error) {
	list := make([]SysMenu, 0)
	whereType := []string{"M", "C"}
	err := Db.Table(sysMenu).In("menu_type", whereType).Where("status=0").Asc("parent_id,order_num").Find(&list)
	if err != nil {
		return list, err
	}
	return list, err
}

func (sysMenu *SysMenu) GetAllMenu(queryParams CommonMap) ([]SysMenu, error) {
	list := make([]SysMenu, 0)
	session := Db.Table(sysMenu).Asc("parent_id,order_num")
	fmt.Println(queryParams)
	fmt.Println(queryParams["status"])
	fmt.Println(queryParams["menuName"])
	if queryParams["status"] != "" {
		session.Where("status=?", queryParams["status"])
	}
	if queryParams["menuName"] != "" {
		name, _ := queryParams["menuName"].(string)
		session.Where("menu_name like ?", "%"+name+"%")
	}
	err := session.Find(&list)
	if err != nil {
		return list, err
	}
	return list, err
}

func (sysMenu *SysMenu) Find(id int) error {
	_, err := Db.Id(id).Get(sysMenu)

	return err
}

func (sysMenu *SysMenu) NameExists(name string, id int) (int64, error) {
	if id > 0 {
		return Db.Where("menu_name = ? AND menu_id != ?", name, id).Count(sysMenu)
	}

	return Db.Where("menu_name = ?", name).Count(sysMenu)
}

// Create 新增
func (sysMenu *SysMenu) Create() (insertId int64, err error) {
	_, err = Db.Insert(sysMenu)
	if err == nil {
		insertId = sysMenu.MenuId
	}

	return
}

// Update 更新
func (sysMenu *SysMenu) Update(id int) (int64, error) {
	return Db.Table(sysMenu).Cols("Component ,CreateBy ,CreateTime ,Icon ,IsCache ,IsFrame ,MenuId ,MenuName ,MenuType ,OrderNum ,ParentId ,Path ,Perms ,Query ,Remark ,Status ,UpdateBy ,UpdateTime ,Visible").ID(id).Update(sysMenu)
}
func (sysMenu *SysMenu) Delete(id int) (int64, error) {
	return Db.Where("menu_id=? or parent_id=?", id, id).Delete(sysMenu)
}
